<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<title>DNMP - аутентификация и авторизация</title>
<link href="ice.css" type="text/css" rel="stylesheet"/>
</head>
<body>
<h4>Distributed Network Messaging Protocol</h4>

<p>Коммерческое использование только с разрешения автора.<br>
При использовании необходимо явно указывать ссылку на источник.</p>

<p>Sergey Bodrov, 2010-11-06</p>

<h4>Аутентификация</h4>

Аутентификация происходит при подключении одного участника сети (гость) к другому
(хозяин). После установки соединения хозяин сообщает свое 
<abbr title="Общедоступная информация - адрес, имя, GUID, владелец, итд..">резюме</abbr> и
кодовое слово - набор случайных символов. Гость шифрует полученное от хозяина
кодовое слово своим ключом и отправляет шифр хозяину вместе с информацией о
себе. Хозяин расшифровывает шифр своей копией ключа гостя и сравнивает с 
отправленным ранее кодовым словом. Если сравнение успешно, то авторизация
считается успешной.<br>
<br>
Если у гостя и хозяина нет ключей, то ключом становится кодовое слово, которое
хозяин сообщил гостю при первом подключении. После этого требуется подтверждение
авторизации.

<h4>Порядок аутентификации:</h4>

<ol>
<li>
Хозяин -> Гость<br>
Резюме, кодовое слово (строка случайных символов)<br>
</li>
<br>
<li>
Гость -> Хозяин<br>
Резюме и кодовое слово, шифрованое своим ключом<br>
<br>
Действия Хозяина:<br>
Поиск резюме Гостя в списках известных узлов и точек.<br>
<ul>
<li>Если Гость известен, расшифровываем ответ Гостя, сравниваем с отправленным 
ранее кодовым словом<br></li>
<li>Если Гость неизвестен, то резюме Гостя добавляется в список 
неавторизованных контактов, кодовое слово становится ключом Гостя.<br></li>
</ul>
</li>
<br>
<li>
Хозяин -> Гость<br>
результат опознания<br>
</li>
</ol>

<h4>Подтверждение авторизации точек</h4>

После первого подключения точки к узлу, администратор узла должен подтвердить
авторизацию точки, в дальнейшем авторизация будет происходить автоматически.
После подтверждения авторизации точка получает новый адрес. Если у точки нет 
паспорта, то узел создает новый паспорт точки, выдает ей новый GUID. Если у
точки уже есть паспорт, то узел может переместить этот паспорт с другого узла.<br>

<h4>Подтверждение авторизации узлов</h4>

После первого подключения одного узла к другому, для подтверждения авторизации
узлы должны провести аутентификацию шифроваными сообщениями через сеть, по 
правилам маршрутизации. После этого авторизация при прямом соединении этих двух
узлов будет происходить автоматически.<br>
<br>
Возможно использование упрощенного варианта подтверждения авторизации узлов,
когда узлы сообщают друг другу свои ключи в открытом виде.


<h4>Действия после авторизации узла</h4>

<h4>Формат сообщений</h4>

<p>
<u>Обязаительные реквизиты для всех сообщений</u><br>
Тип: <b>AUTH</b><br>
Параметры:<br>
<b>cmd</b> - название команды<br>
</p>


При подключении точки к узлу, узел генерирует случайный ключ (ключ опознания) и передает его подключившемуся вместе с информацией о себе. В качестве адреса подключившегося используется адрес 0.0

<p>
<u>Запрос авторизации (Authentication Request):</u><br>
Параметры:<br>
<b>cmd=AURQ</b><br>
<b>name</b> - название узла<br>
<b>owner</b> - информация о владелеце узла<br>
Данные:<br>
ключ опознания<br>
</p>

Точка шифрует полученный ключ опознания своим ключом и отправляет обратно вместе с информацией о себе.

<p>
<u>Ответ на запрос авторизации (Authentication Reply):</u><br>
Параметры:<br>
<b>cmd=ARPL</b><br>
<b>name</b> - название узла<br>
<b>owner</b> - информация о владелеце узла<br>
Данные:<br>
шифрованый ключ опознания<br>
</p>

Узел получает ответ и ищет паспорт точки в списке известных линков по ее адресу или GUID. Если найден, то сервер шифрует ключ опознания известным ему ключом клиента и сравнивает результат с полученым от линка. Если шифры совпадают, значит линк опознан и возвращается результат "ОК". Если ключи не совпадают, значит клиент не опознан и требует ручного подтверждения авторизации. После ручного подтверждения ключ опознания становится ключом клиента.

<p>
<u>Результат опознания (Authentication Result):</u><br>
Параметры:<br>
<b>cmd=ARSL</b><br>
<b>auth_result</b> - результат опознания<br>
Данные:<br>
нет<br>
</p>


</body>
</html>